
// 问
// function Foo() {
//   getName = function() {
//     console.log(1);
//   }
//   console.log(this);
//   return this;
// }
// Foo.getName = function() {
//   console.log(2);
// }
// Foo.prototype.getName = function () {
//   console.log(3);
// }
// var getName = function () {
//   console.log(4);
// }
// function getName() {
//   console.log(5);
// }

// Foo.getName();
// getName();
// Foo().getName();
// getName();
// new Foo.getName();
// new Foo().getName();
// new new Foo().getName();





// 答

// 构造函数
function Foo() {
  // 全局变量
  getName = function() {
    console.log(1);
  }
  // console.log(this); // ? -> window
  return this;
}
// 函数Foo上的静态方法 -> 一个函数对象上的方法/属性
Foo.getName = function() {
  console.log(2);
  // console.log(this);
}
// 扩展函数原型上的方法
Foo.prototype.getName = function () {
  console.log(3);
}
// 给全局变量赋值为一个匿名函数
/**
 * 全局预编译GO
 * GO {} 生成GO对象 GO｛｝(global object) 这个GO就是window
 * GO {
 *  将全局的变量声明（的名）储存一GO对象中，value为undefinde
 *  getName: undefined -> function getName() {} 预编译阶段结束
 *    执行时 赋值
 *    function getName() {} -> function getName() { console.log(4); }
 *    将全局的函数声明的函数名作为go对象中的key, 函数整体内容为value储存到go对象中
 * }
 */
var getName = function () {
  console.log(4);
}
// 函数声明
function getName() {
  console.log(5);
}

// Foo上的静态方法
Foo.getName(); // 2

getName(); // 4

// Foo() -> this -> window -> window.getName() 
Foo().getName(); // 1
// window.getName() -> 1 -> getName() -> 1
getName(); // 1

// Foo.getName() -> 2 这里的new 没有什么用
// this -> {} 实例化的对象
new Foo.getName(); // 2 

// var foo = new Foo() -> foo.getName() -> Foo.prototype.getName()
new Foo().getName(); // 3

// new Foo().getName() 已经是实例化后的对象了，再 new 没有实际意义
new new Foo().getName(); // 3
